package com.zgg.config.datasource;

import com.zgg.enums.DataSourceEnum;
import org.springframework.beans.factory.annotation.Value;

import java.util.*;

/**
 * 抽象类，对于DataSource的定义、注册、更新等进行抽象。
 * 对参数进行预处理
 * Created by li on 2017/4/25.
 */
public abstract class AbstractDataSources implements DataSource {
//    //zookeeper配置的服务器ip及端口
//    @Value("${zookeeper.serverUrl}")
//    public String serverUrl;
//    /**
//     * 本地数据库是否在注册中心zookeeper进行注册
//     * 如果不在zookeeper中注册，则只使用本地数据库配置。
//     */
//    @Value("${zookeeper.registra}")
//    public boolean registra = false;

//    @Value("${pagehelper.reasonable}")
//    public boolean reasonable;
//    @Value("${pagehelper.support-methods-arguments}")
//    public boolean supportMethodsArguments;
//    @Value("${pagehelper.offset-as-page-num}")
//    public boolean offsetAsPageNum;
//    @Value("${pagehelper.row-bounds-with-count}")
//    public boolean rowBoundsWithCount;
//    @Value("${pagehelper.page-size-zero}")
//    public boolean pageSizeZero;
//    @Value("${pagehelper.return-pageInfo}")
//    public String returnPageInfo;
//    @Value("${pagehelper.params}")
//    public String params;
//    @Value("${pagehelper.dialect}")
//    public String dialect;

//    /**
//     * 从注册中心获取其它注册的数据库配置信息，并将其添加到本地DataSource中。
//     */
//    public Map<Object, Object> createTargetDataSourcesMap() {
//        Map<Object, Object> targetDataSources = new HashMap<>();
//
//        /**
//         * 本方法从zookeeper中取得注册的数据库配置，组合出一个map集合。
//         * 将集合添加到AbstractRoutingDataSource的子类DynamicDataSource中。从而可以集中的管理dataSource
//         */
//        String nodePath = parentNodePath + parentNodeName;
//        ZkNode zkNode = ZookeeperUtils.getTreeNodes(serverUrl, nodePath);
//        if (zkNode.getNodes() != null) {
//            for (ZkNode zkNode1 : zkNode.getNodes()) { // dataSource/ip
//                DataSource druidDataSource = null;
//                if (zkNode1.getNodes() != null) {
//                    for (ZkNode zkNode2 : zkNode1.getNodes()) {// dataSource/ip/databaseName
//                        // TODO 取得数据库名
//                        String databaseName = StringUtils.substringAfter(zkNode2.getNodePath(), nodePath + parentNodePath);
//                        if (targetDataSources.get(databaseName) == null) {
//                            Properties properties = new Properties();
//                            if (zkNode2.getNodes() != null) {
//                                for (ZkNode zkNode3 : zkNode2.getNodes()) { // database connection parameter
//                                    // TODO 配置信息由于是path路径，需要对其进行分割并取最后一个。
//                                    String[] temp = zkNode3.getNodePath().split(parentNodePath);
//                                    properties.put(temp[temp.length - 1], zkNode3.getNodeContext());
//                                }
//                            }
//                            // TODO 创建一个dataSource对象
//                            try {
//                                druidDataSource = DruidDataSourceFactory.createDataSource(properties);
//                            } catch (Exception e) {
//                                e.printStackTrace();
//                            }
//                            targetDataSources.put(databaseName, druidDataSource);
//                        }
//                    }
//                }
//            }
//        }
//        return targetDataSources;
//    }

    /**
     * 从本地配置文件中，将database连接信息读取并放到Properties中，用于生成本地dataSource。
     *
     * @return
     */
    public Map<String, Properties> getResource(String filepath) {
        Map<String, Properties> map = new HashMap();
        //加载jdbc.properties文件
        ResourceBundle rb = ResourceBundle.getBundle(filepath, Locale.getDefault());
        //取得所有数据源的名称并分割
        String[] dataSourceNameArray = rb.getString("datasourceName").split(",");

        /**
         * 根据数据源的名称，获取对应的属性，并创建DruidDataSource对象。
         * 将DruidDataSource对象添加到targetDataSources属性中。
         * 设置主数据源。
         */
        for (int i = 0; i < dataSourceNameArray.length; i++) {
            String markName = dataSourceNameArray[i];
            String databaseName = rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.DATABASE_NAME.getValue());
            Properties properties = new Properties();
            properties.put(DataSourceEnum.DRIVER_CLASS_NAME.getValue(), rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.DRIVER_CLASS_NAME.getValue()));
            properties.put(DataSourceEnum.URL.getValue(), rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.URL.getValue()));
//            properties.put(DataSourceEnum.IP.getValue(), rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.IP.getValue()));
            properties.put(DataSourceEnum.USERNAME.getValue(), rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.USERNAME.getValue()));
            properties.put(DataSourceEnum.PASSWORD.getValue(), rb.getString(markName + DataSourceEnum.POINT.getValue() + DataSourceEnum.PASSWORD.getValue()));
            properties.put(DataSourceEnum.DATABASE_NAME.getValue(), databaseName);
            map.put(markName, properties);
        }

        return map;
    }
}
